#include <iostream>
#include <memory>
#include <sys/epoll.h>
#include "log.hpp"
#include "socket.hpp"
#include "reactor.hpp"
#include "InetAddr.hpp"
#include "listener.hpp"
#include "package_parse.hpp"
#include "handler_connection.hpp"
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "usage::" << argv[0] << " port" << std::endl;
        return 0;
    }
    uint16_t port = std::stoi(argv[1]); // 服务端端口号

    EnableScrean(); // 开启日志

    std::unique_ptr<reactor> reac_ptr = std::make_unique<reactor>();   // 创建指向reactor类的智能指针reac_ptr
    handler_connection hc(PackageParse::Parse);                       // 创建handler_connection 对象并传递parse参数
    listener list(port, hc);                                           // 创建lister对象，并传递端口号和handler_connection对象
    reac_ptr->add_connection(                                          // 调用reator类成员函数
        list.sockfd(),                                                 // 文件描述符
        EPOLLIN | EPOLLET,                                             // 要关心的事件，ET模式
        std::bind(&listener::_accepter, &list, std::placeholders::_1), // 设置回调函数，处理连接listen套接字请求事件方法
        // 创建函数对象，它封装了对listener类的accepter成员函数的调用
        // 这个函数对象在调用时，将list实例作为this指针
        // 当调用这个函数对象，并传递一个实参时，这个参数作为accepter函数的第一个参数
        nullptr,  // 第一调用为连接listen套接字，没有写入方法
        nullptr); // 没有异常处理方法
    reac_ptr->dispatcher();
    return 0;
}
